#include "password.h"

#include <cryptopp/sha.h>
#include <sstream>
#include <iomanip>

/**
 * 加密密码
 * @param password 密码指针
 */
void encrypt_password(const std::shared_ptr<std::string> &password) {
    // 创建一个用于存储哈希值的数组
    unsigned char digest[CryptoPP::SHA256::DIGESTSIZE];

    // 创建一个SHA256对象
    CryptoPP::SHA256 hash;
    // 使用SHA256对象处理密码字符串
    hash.CalculateDigest(digest, (unsigned char *) password->c_str(), password->size());

    // 创建一个字符串流
    std::stringstream ss;
    // 循环储存的哈希值
    for (auto i: digest) {
        // 将哈希值转换为十六进制字符串
        ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(i);
    }

    // 将十六进制字符串赋值给原始的密码字符串
    *password = ss.str();
}

/**
 * 解密密码
 * @param password 密码指针
 */
void decrypt_password(const std::shared_ptr<std::string> &password) {
}

/**
 * 验证密码
 * @param password 密码
 * @param hash 密码哈希
 * @return 是否匹配
 */
bool verify_password(const std::string &password, const std::string &hash) {
    // 创建一个局部副本，以避免修改原始密码
    auto password_copy = std::make_shared<std::string>(password);
    // 加密密码
    encrypt_password(password_copy);
    // 对比密码是否一致
    return *password_copy == hash;
}